package cn.chengpengper.seckill.reservation.domain.repository;

import cn.chengpengper.seckill.reservation.domain.model.entity.SeckillReservationConfig;
import cn.chengpengper.seckill.reservation.domain.model.entity.SeckillReservationUser;

import java.util.List;

/**
 * @author chengpeng.hu
 */
public interface SeckillReservationRepository {
    /**
     * 保存预约配置
     *
     * @param seckillReservationConfig 预约配置
     * @return 是否保存成功
     */
    boolean saveSeckillReservationConfig(SeckillReservationConfig seckillReservationConfig);

    /**
     * 更新预约配置
     *
     * @param seckillReservationConfig 预约配置
     * @return 是否更新成功
     */
    boolean updateSeckillReservationConfig(SeckillReservationConfig seckillReservationConfig);

    /**
     * 更新配置状态
     *
     * @param status  配置状态
     * @param goodsId 商品ID
     * @return 是否更新成功
     */
    boolean updateConfigStatus(Integer status, Long goodsId);

    /**
     * 获取配置列表
     *
     * @return 配置列表
     */
    List<SeckillReservationConfig> getConfigList();

    /**
     * 获取配置详情
     *
     * @param goodsId 商品ID
     * @return 配置详情
     */
    SeckillReservationConfig getConfigDetail(Long goodsId);

    /**
     * 根据商品id查看预约用户列表
     *
     * @param goodsId 商品ID
     * @param status  状态
     * @return 预约用户列表
     */
    List<SeckillReservationUser> getUserListByGoodsId(Long goodsId, Integer status);

    /**
     * 根据用户id查看预约的商品列表
     *
     * @param userId 用户ID
     * @param status 状态
     * @return 商品列表
     */
    List<SeckillReservationUser> getGoodsListByUserId(Long userId, Integer status);

    /**
     * 预约秒杀商品
     *
     * @param seckillReservationUser 预约配置
     * @return 是否预约成功
     */
    boolean reserveGoods(SeckillReservationUser seckillReservationUser);

    /**
     * 取消预约秒杀商品
     *
     * @param goodsId 商品ID
     * @param userId  用户ID
     * @return 是否取消成功
     */
    boolean cancelReserveGoods(Long goodsId, Long userId);

    /**
     * 获取用户预约的某个商品信息
     *
     * @param userId  用户ID
     * @param goodsId 商品ID
     * @param status  状态
     * @return 商品信息
     */
    SeckillReservationUser getSeckillReservationUser(Long userId, Long goodsId, Integer status);

}
